
#include "util.hpp"
#include <cstdio>
#include <vector>
#include <functional>

using func_t = function<void()>;

// 给系统添加一些其他的事件
#define INIT(v) do{\
    v.push_back(printLog);\
    v.push_back(downLoad);\
    v.push_back(executeSql);\
}while(0)

#define EXEC_OTHER(cbs) do{\
    for(auto const &cb:cbs) { cb(); }\
} while(0)

int main()
{
    vector<func_t> cbs;
    INIT(cbs);

    SetNoBlock(0);
    while (true)
    {
        printf(">>> ");
        fflush(stdout);
        char buffer[1024];
        int n = read(0, buffer, sizeof(buffer) - 1);
        if (n > 0)
        {
            buffer[n] = 0;
            cout << "echo#" << buffer << endl;
        }
        else if (n == 0)
        {
            cout << "read end" << endl;
            break;
        }
        else
        {
            // 1.当我不输入时，底层没有数据算错误吗？ 不算，只是以错误的形式返回
            // 2.我又如何区分是真的错了还是底层没数据？ 单靠返回值无法区分，

            if(errno == EAGAIN)
            {
                cout << "底层没数据，请再读一次 " << endl;
                EXEC_OTHER(cbs);
            }
            else if(errno == EINTR) //因为某些原因，中断读取，所以重新读取
            {
                continue;
            }
            else
            {
                cout << "result:" << n  << "errno:" << strerror(errno) << endl;
                break;
            }
        }

        sleep(1);
    }

    return 0;
}
